/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../../../../xoskit/xos_helper/include/declare.h"
#include "../../../../xoskit/xos_helper/include/define.h"
#include "os.h"

namespace xos_base
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_container::i_container * container_ptr = 0;
    static void * module_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    os::os()
    {}

    os::~os()
    {}

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    xos_container::i_container * os::container()
    {
        return container_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int os::init()
    {
        int ret = 0;

        xos_container::i_container * pObj = 0;
        void * pModule = 0;

        xos_container::f_create fun = 0;

        if( 0 == ret )
        {
            ret = xos_helper::xos_load_and_get( ( void ** )&fun,
                pModule,
                0,
                "xos_container",
                "create" );
        }

        if( 0 == ret )
        {
            ret = fun( &pObj );
        }

        if( 0 == ret )
        {
            module_ptr = pModule;
            container_ptr = pObj;
            pModule = 0;
            pObj = 0;
        }

        xos_stl::release_interface( pObj );
        xos_helper::xos_free( pModule );

        return ret;
    }

    int os::term()
    {
        int ret = 0;

        xos_stl::release_interface( container_ptr );
        xos_helper::xos_free( module_ptr );

        return ret;
    }

} // xos_base
